package com.gopay.bis.service.bank.impl.wap;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;

import com.gopay.bis.common.util.BankLogUtils;
import com.gopay.bis.common.util.BisPayCheckUtils;
import com.gopay.bis.common.util.constants.BisPayConstants;
import com.gopay.bis.manager.bank.Wap.PsbcWapB2cManager;
import com.gopay.common.Result;
import com.gopay.common.constants.bank.PsbcConstants;
import com.gopay.common.constants.proccode.ProcCodeConstants;
import com.gopay.common.domain.bank.BaseMessage;
import com.gopay.common.domain.bank.psbc.ebank.PsbcB2cMessage;
import com.gopay.common.exception.GopayException;
import com.gopay.remote.bank.WapPayInteractRemoteService;

/**
 * 邮储银行wap支付service
 * 
 * @PsbcWapPayB2CBankServiceImpl.java
 * @author zhengxue
 * @2016-12-1 上午11:11:38 www.gopay.com.cn Inc.All rights reserved.
 */
public class PsbcWapPayB2CBankServiceImpl implements WapPayInteractRemoteService {
    @Resource(name = "psbcWapB2cManager")
    private PsbcWapB2cManager psbcWapB2cManager;

    @Override
    public Result pay(BaseMessage base) {
        Result result = new Result(false);
        try {
            PsbcB2cMessage messageB2C = new PsbcB2cMessage();
            BeanUtils.copyProperties(base, messageB2C);
            PsbcB2cMessage psbcB2cMessage = (PsbcB2cMessage) psbcWapB2cManager.sign(messageB2C);
            result.setDefaultModel(psbcB2cMessage);
            result.setSuccess(true);
        } catch (GopayException e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(e.getErrCode());
        } catch (Exception e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6029);
        }
        return result;
    }

    @Override
    public Result bankBack(BaseMessage base) {
        Result result = new Result(false);
        try {
            boolean flag = false;
            PsbcB2cMessage messageB2C = new PsbcB2cMessage();
            BeanUtils.copyProperties(base, messageB2C);
            flag = (Boolean) psbcWapB2cManager.verify(messageB2C);
            result.setModel("message", messageB2C);
            result.setDefaultModel(flag);
            result.setSuccess(true);
            if (result.isSuccess() && flag) {
                Map<String, String> param = new HashMap<String, String>();
                // 银行返回成功状态
                if (PsbcConstants.PAY_RSP_CODE_SUCCESS.equals(messageB2C.getRespCode())) {
                    param.put("orderId", messageB2C.getOrderId());
                    param.put("amt", messageB2C.getAmount().toString());
                    param.put("cardType", "Unknown");
                    param.put("notifyNum", "1");
                    param.put("payStatus", "00");
                    param.put("retCode", "00");
                    param.put("retMsg", "验签成功");
                    param.put("signData", messageB2C.getSignMessage());
                    param.put("isFront", base.isFront() + "");
                    result.setModel("isNotifyCashier", param);
                    result.setOrderStatus(true);
                } else {
                    // 通知后台地址该订单失败
                    param.put("orderId", messageB2C.getOrderId());
                    param.put("amt", messageB2C.getAmount().toString());
                    param.put("cardType", "Unknown");
                    param.put("notifyNum", "1");
                    param.put("payStatus", "01");
                    param.put("retCode", "01");
                    param.put("retMsg", "验签失败");
                    param.put("signData", messageB2C.getSignMessage());
                    param.put("isFront", base.isFront() + "");
                    result.setModel("isNotifyCashier", param);
                    result.setOrderStatus(false);
                }
            }
        } catch (GopayException e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(e.getErrCode());
        } catch (Exception e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6064);
        }
        return result;
    }

    @Override
    public Result query(BaseMessage base) {
        Result result = new Result(false);
        try {
            PsbcB2cMessage messageB2C = new PsbcB2cMessage();
            BeanUtils.copyProperties(base, messageB2C);
            PsbcB2cMessage res = (PsbcB2cMessage) psbcWapB2cManager.query(messageB2C);
            result.setDefaultModel(res);
            result.setSuccess(true);
            if (BisPayCheckUtils.checkExternalOrderID(messageB2C.getOrderId())) {
                Map<String, String> param = new HashMap<String, String>();
                param.put("orderId", messageB2C.getOrderId());
                param.put("amount", messageB2C.getAmount().toString());
                if (res == null) {
                    // 查询订单为空
                    param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
                    param.put("returnMessage", "银行返回对账结果为空");
                    param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
                    result.setModel("queryResult", param);
                    return result;
                }

                if (!PsbcConstants.PAY_RSP_CODE_SUCCESS.equals(res.getRespCode())) {
                    // 查询订单错误
                    param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
                    param.put("returnMessage", "银行订单查询失败");
                    param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
                    result.setModel("queryResult", param);
                    return result;
                }
                // 成功处理
                if (StringUtils.equals(PsbcConstants.B2C_ORDER_STATUS_SUCC, res.getCompFlag())) {
                    param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
                    param.put("tradeState", BisPayConstants.TRADESTATE_SUCCESS);
                    param.put("returnMessage", "交易成功");
                }
                // 失败处理
                else if (StringUtils.equals(PsbcConstants.B2C_ORDER_STATUS_FAIL, res.getCompFlag())) {
                    param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
                    param.put("tradeState", BisPayConstants.TRADESTATE_FAIL);
                    param.put("returnMessage", res.getErrorMsg());
                }
                // 不处理
                else {
                    String errorMsg = res.getErrorMsg();
                    param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
                    param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
                    param.put("returnMessage", errorMsg);
                }
                result.setModel("queryResult", param);
            }
        } catch (GopayException e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(e.getErrCode());
        } catch (Exception ex) {
            BankLogUtils.printServiceImplExceptionLog(ex);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6033);
        }
        return result;
    }

    @Override
    public Result queryBack(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Result refund(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Result dayend(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

}
